home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / time / RCS / Time_ToParts.c,v < prev    next >
Text File  |  1991-10-22  |  7KB  |  351 lines

  1. head     1.4;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.4.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.4
  10. date     90.09.11.14.28.37;  author kupfer;  state Exp;
  11. branches 1.4.1.1;
  12. next     1.3;
  13.  
  14. 1.3
  15. date     89.10.03.22.04.50;  author jhh;  state Exp;
  16. branches ;
  17. next     1.2;
  18.  
  19. 1.2
  20. date     88.06.27.17.23.41;  author ouster;  state Exp;
  21. branches ;
  22. next     1.1;
  23.  
  24. 1.1
  25. date     88.06.19.14.33.16;  author ouster;  state Exp;
  26. branches ;
  27. next     ;
  28.  
  29. 1.4.1.1
  30. date     91.10.22.14.54.18;  author kupfer;  state Exp;
  31. branches ;
  32. next     ;
  33.  
  34.  
  35. desc
  36. @@
  37.  
  38.  
  39. 1.4
  40. log
  41. @Use function prototypes.
  42. @
  43. text
  44. @/* 
  45.  * Time_ToParts.c --
  46.  *
  47.  *    Source code for the Time_ToParts library procedure.
  48.  *
  49.  * Copyright 1988 Regents of the University of California
  50.  * Permission to use, copy, modify, and distribute this
  51.  * software and its documentation for any purpose and without
  52.  * fee is hereby granted, provided that the above copyright
  53.  * notice appear in all copies.  The University of California
  54.  * makes no representations about the suitability of this
  55.  * software for any purpose.  It is provided "as is" without
  56.  * express or implied warranty.
  57.  */
  58.  
  59. #ifndef lint
  60. static char rcsid[] = "$Header: /sprite/src/lib/c/time/RCS/Time_ToParts.c,v 1.3 89/10/03 22:04:50 jhh Exp Locker: kupfer $ SPRITE (Berkeley)";
  61. #endif not lint
  62.  
  63. #include <sprite.h>
  64. #include <spriteTime.h>
  65.  
  66. /* 
  67.  * Forward declarations:
  68.  */
  69. static int YearLength _ARGS_((int year));
  70.  
  71.  
  72. /* 
  73.  *----------------------------------------------------------------------
  74.  *
  75.  *  YearLength --
  76.  *
  77.  *  Result:
  78.  *    The number of days in the year.
  79.  *
  80.  *  Side effects:
  81.  *    None.
  82.  *
  83.  *----------------------------------------------------------------------
  84.  */
  85.  
  86. static int
  87. YearLength(year)
  88.     int year;
  89. {
  90.     if (year%400 == 0) {
  91.     return(366);
  92.     }
  93.     if (year%100 == 0) {
  94.     return(355);
  95.     }
  96.     if (year%4 == 0) {
  97.     return(366);
  98.     }
  99.     return(365);
  100. }
  101.  
  102. /*
  103.  *----------------------------------------------------------------------
  104.  *
  105.  *  Time_ToParts --
  106.  *
  107.  *    Converts a time value into its components.
  108.  *    If relative time is specified, the time is broken down to days,
  109.  *    hours, minutes and seconds only.
  110.  *
  111.  *    Modified from UNIX ctime.c -- NEEDS TO BE REWRITTEN!!
  112.  *
  113.  * Results:
  114.  *    None.
  115.  *
  116.  * Side effects:
  117.  *    None.
  118.  *
  119.  *----------------------------------------------------------------------
  120.  */
  121.  
  122. void
  123. Time_ToParts(time, relativeTime, partsPtr)
  124.     int     time;
  125.     Boolean     relativeTime;
  126.     register Time_Parts *partsPtr;
  127. {
  128.     int         hms, day;
  129.     int        dayOfMonth, month, year;
  130.     Boolean        negative;
  131.     static int     monthLengths[] = {
  132.         31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  133.     static int     leapMonthLengths[] = {
  134.         31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  135.     int        *monthLenPtr;
  136.  
  137.     /*
  138.      * break initial number into days
  139.      */
  140.  
  141.     if (time < 0) {
  142.         negative = TRUE;
  143.         time = -time;
  144.     } else {
  145.         negative = FALSE;
  146.     }
  147.     hms = time % 86400;
  148.     day = time / 86400;
  149.     if (hms<0) {
  150.         hms += 86400;
  151.         day -= 1;
  152.     }
  153.  
  154.     /*
  155.      * generate hours:minutes:seconds
  156.      */
  157.     partsPtr->seconds     = hms % 60;
  158.     hms             /= 60;
  159.     partsPtr->minutes    = hms % 60;
  160.     partsPtr->hours     = hms / 60;
  161.  
  162.     /*
  163.      * For a relative time, determine days, hours, minutes and seconds only.
  164.      */
  165.  
  166.     if (relativeTime) {
  167.         if (negative) {
  168.         partsPtr->dayOfYear = -day;
  169.         } else {
  170.         partsPtr->dayOfYear = day;
  171.         }
  172.         return;
  173.     }
  174.  
  175.     /*
  176.      * day is the day number.
  177.      * generate day of the week.
  178.      * The addend is 4 mod 7 (1/1/1970 was Thursday)
  179.      */
  180.  
  181.     partsPtr->dayOfWeek = (day + 7340036) % 7;
  182.  
  183.     /*
  184.      * year number
  185.      */
  186.     if (day >= 0) {
  187.         for(year=70; day >= YearLength(year); year++) {
  188.         day -= YearLength(year);
  189.         }
  190.     } else {
  191.         for (year=70; day<0; year--) {
  192.         day += YearLength(year-1);
  193.         }
  194.     }
  195.     partsPtr->year         = year;
  196.     partsPtr->dayOfYear     = day;
  197.  
  198.     /*
  199.      * generate month
  200.      */
  201.  
  202.     if (YearLength(year)==366) {
  203.         monthLenPtr = leapMonthLengths;
  204.     } else {
  205.         monthLenPtr = monthLengths;
  206.     }
  207.     
  208.     for (dayOfMonth = day, month=0; 
  209.          dayOfMonth >= monthLenPtr[month]; 
  210.          month++) {
  211.         dayOfMonth -= monthLenPtr[month];
  212.     }
  213.     dayOfMonth += 1;
  214.     partsPtr->dayOfMonth     = dayOfMonth;
  215.     partsPtr->month     = month;
  216. }
  217.  
  218. /*
  219.  *----------------------------------------------------------------------
  220.  *
  221.  *  Time_FromParts --
  222.  *
  223.  *    Converts components of a time into a time value.
  224.  *    If relative time is specified, the time comprised of days,
  225.  *    hours, minutes and seconds only.
  226.  *
  227.  *    Modified from UNIX ctime.c -- NEEDS TO BE REWRITTEN!!
  228.  *      IMPORTANT: won't do dates before 1970!!!
  229.  *
  230.  * Results:
  231.  *    SUCCESS if time was converted, FAILURE otherwise.
  232.  *
  233.  * Side effects:
  234.  *    None.
  235.  *
  236.  *----------------------------------------------------------------------
  237.  */
  238.  
  239. ReturnStatus
  240. Time_FromParts(partsPtr,relativeTime, timePtr)
  241.     register Time_Parts *partsPtr;
  242.     Boolean     relativeTime;
  243.     int     *timePtr;
  244. {
  245.  
  246. #define CENTURY    1900
  247.  
  248.     int        month, year;
  249.     static int     monthLengths[] = {
  250.         31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  251.     static int     leapMonthLengths[] = {
  252.         31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  253.     int        *monthLenPtr;
  254.     int         days;
  255.     int        seconds;
  256.     int        dayOfYear = 0;
  257.  
  258.     if  (partsPtr->year < 70) {
  259.     return FAILURE;
  260.     }
  261.     if ((partsPtr->dayOfMonth == -1) && (partsPtr->dayOfYear == -1)) {
  262.     return FAILURE;
  263.     }
  264.     days = 0;
  265.     if (!relativeTime) {
  266.     for (year = 1970; year < partsPtr->year + CENTURY; year++) {
  267.         days += YearLength(year);
  268.     } 
  269.     if (partsPtr->dayOfMonth != -1) {
  270.         if (YearLength(partsPtr->year + CENTURY) == 366) {
  271.         monthLenPtr = leapMonthLengths;
  272.         } else {
  273.         monthLenPtr = monthLengths;
  274.         }
  275.         for (month = 0; month < partsPtr->month; month++) {
  276.         dayOfYear += monthLenPtr[month];
  277.         }
  278.         dayOfYear += partsPtr->dayOfMonth - 1;
  279.         if (partsPtr->dayOfYear != -1) {
  280.         if (dayOfYear != partsPtr->dayOfYear) {
  281.             return FAILURE;
  282.         }
  283.         }
  284.     } else {
  285.         dayOfYear = partsPtr->dayOfYear;
  286.     }
  287.     }
  288.     days += dayOfYear;
  289.     seconds = days * (24 * 60 * 60);
  290.     seconds += partsPtr->hours * 60 * 60;
  291.     seconds += partsPtr->minutes * 60;
  292.     seconds += partsPtr->seconds;
  293.     *timePtr = seconds;
  294.     return SUCCESS;
  295. }
  296. @
  297.  
  298.  
  299. 1.4.1.1
  300. log
  301. @Initial branch for Sprite server.
  302. @
  303. text
  304. @d17 1
  305. a17 1
  306. static char rcsid[] = "$Header: /sprite/src/lib/c/time/RCS/Time_ToParts.c,v 1.4 90/09/11 14:28:37 kupfer Exp $ SPRITE (Berkeley)";
  307. @
  308.  
  309.  
  310. 1.3
  311. log
  312. @Added Time_FromParts
  313. @
  314. text
  315. @d17 1
  316. a17 1
  317. static char rcsid[] = "$Header: Time_ToParts.c,v 1.2 88/06/27 17:23:41 ouster Exp $ SPRITE (Berkeley)";
  318. d22 5
  319. @
  320.  
  321.  
  322. 1.2
  323. log
  324. @Use spriteTime.h instead of time.h.
  325. @
  326. text
  327. @d17 1
  328. a17 1
  329. static char rcsid[] = "$Header: Time_ToParts.c,v 1.1 88/06/19 14:33:16 ouster Exp $ SPRITE (Berkeley)";
  330. d42 2
  331. a43 2
  332.     if((year%4) == 0) {
  333.         return(366);
  334. d45 6
  335. d168 79
  336. @
  337.  
  338.  
  339. 1.1
  340. log
  341. @Initial revision
  342. @
  343. text
  344. @d17 1
  345. a17 1
  346. static char rcsid[] = "$Header: proto.c,v 1.2 88/03/11 08:39:08 ouster Exp $ SPRITE (Berkeley)";
  347. d21 1
  348. a21 1
  349. #include "time.h"
  350. @
  351.